package model

import (
	"database/sql"
	"github.com/goccy/go-json"
	"gorm.io/datatypes"
)

type JSONType struct {
	datatypes.JSON
}

func (m JSONType) MarshalBinary() (data []byte, err error) {
	return json.Marshal(m)
}

func (m *JSONType) UnmarshalBinary(data []byte) error {
	return json.Unmarshal(data, m)
}

type Null[T any] struct {
	sql.Null[T]
}

func (v Null[T]) MarshalBinary() (data []byte, err error) {
	if v.Valid {
		return json.Marshal(v)
	}
	return json.Marshal(nil)
}

func (v *Null[T]) UnmarshalBinary(data []byte) error {
	var s *T
	if err := json.Unmarshal(data, &s); err != nil {
		return err
	}
	if s != nil {
		v.Valid = true
		v.V = *s
	} else {
		v.Valid = false
	}
	return nil
}
